Список Задач + SQLite + Interface + DI
➡️Ссылка на репозиторий с кодом этого урока
Создание сервиса SqliteService
Добавим новый файл, в котором будет реализована вся логика работы с базой данных SQLite. Этот класс, как и SharedPreferencesService, должен реализовать интерфейс IStorageService.
Пакет sqflite предлагает два основных способа выполнения SQL-запросов:
- Через "чистые" SQL-строки
- Через встроенные функции-хелперы, которые напоминают работу с ORM (Object-Relational Mapping
База по SQL
Чтобы понимать, что происходит "под капотом" в SqliteService, полезно знать основы языка SQL (Structured Query Language) — стандартного языка для взаимодействия с базами данных.
SQL-команды, которые мы использовали, относятся к основным операциям CRUD (Create, Read, Update, Delete).
CREATE TABLE - Создание таблицы
Эта команда используется для определения структуры таблицы, ее колонок и типов данных.
CREATE TABLE tasks(
id INTEGER PRIMARY KEY AUTOINCREMENT, -- Целочисленный уникальный ключ
text TEXT, -- Текстовое поле
isDone INTEGER -- Целочисленное поле (0 или 1)
);

INSERT - Вставить (Create) запись. Добавляет новую строку в таблицу
Вставить (INSERT) значения в таблицу tasks (INTO tasks) в поля id, text, isDone
значениями VALUES (?, ?, ?) вместо вопросов подставятся подряд значения, например из списка
db.rawInsert(
'INSERT INTO tasks(text, isDone) VALUES(?, ?)',
[task.text, 0],
);

SELECT - Чтение (Read) записей
Извлекает данные из таблицы. Это самая часто используемая команда
Выбрать (SELECT) все значения (*) из таблицы tasks
db.rawQuery('SELECT * FROM tasks');

UPDATE - Обновление (Update) записи
Изменяет существующие данные в таблице.
Обновить (UPDATE) запись в таблице (tasks) изменив значение isDone (SET isDone = ?) где ID этой записи равен нужному значению WHERE id = ?
Вместо вопросов подставятся подряд значения, например из списка
db.rawUpdate(
'UPDATE $_tasksTableName SET isDone = ? WHERE id = ?',
[task.isDone ? 1 : 0, task.id],
);

Ключевое слово WHERE указывает, какую именно строку (или строки) нужно обновить. Без него команда UPDATE изменила бы все записи в таблице!
Важно! В SQLite нет типа данных BOOLEAN.
Стандартная практика - использование INTEGER, где 0 означает false, а 1 — true.
Модель Task при преобразовании в JSON преобразует bool в int, но при чтении из базы нужно выполнить обратное преобразование maps[i]['isDone'] == 1
DELETE Удаление (Delete) записи
Удаляет строки из таблицы
Удалить (DELETE) запись из таблицы tasks (FROM tasks) по ID этой записи (WHERE id = ?)
Вместо вопросов подставятся подряд значения, например из списка
db.rawDelete(
'DELETE FROM $_tableName WHERE id = ?',
[id]
);

Как и в UPDATE, WHERE здесь критически важен для указания удаляемой записи.